Android应用 您所在的位置:网站首页 猜数字小游戏教案 信息技术 Android应用

Android应用

2023-08-13 02:25| 来源: 网络整理| 查看: 265

描述: 猜数字游戏包含“猜数”、“排行榜”和“设置” 3个模块。 1)“猜数”模块:随机生成一定范围内的一个整数,用户可以输入自己的猜想数字,程序进行判断并给出“猜大”、“猜小”或“正确”的3种提示 2)“排行榜”模块:根据用户猜对数字的次数进行排名显示。 3)“设置”模块:在这个模块,用户可以设置自己的用户名,也可以选择是否使用“默认姓名”进行后面的每一次猜数游戏 如果使用,后面则直接进行游戏, 如果不使用,后面的每次游戏结束后程序会提示要输入用户名,以便记录游戏历史,并在“排行榜”模块显示。 在“设置”模块,用户还可以选择接下来的要进行的猜数游戏的猜数范围,本次给出1-100,1-1000,1-10000三种范围,大家后期可以根据需要修改调整。 一、程序整体实现效果是这样的: 在这里插入图片描述 在这里插入图片描述在这里插入图片描述在这里插入图片描述 无默认姓名猜对时: 在这里插入图片描述在这里插入图片描述 二、整个项目的结构分析: 先放一张整个Project目录结构: 在这里插入图片描述res下的图片素材: 在这里插入图片描述

接下来,逐一对每个模块实现步骤进行讲解! 【数据库】 新建一个辅助类MyHelper类继承SQLiteOpenHelper类,并实现它的onCreate方法和onUpgrade方法。

package com.example.mygame; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyHelper extends SQLiteOpenHelper { public MyHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table ordertb(_id integer primary key "+"autoincrement," + "name string not null,count integer not null,range integer not null)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

【下方导航栏的实现】

布局中涉及的“strings.xml”文件如下:

猜数 排行榜 设置

布局中涉及的“colors.xml”文件如下:

#737373 #d4257b

在MainActivity中实现导航逻辑之前,先搭个基本页面框架: 新建GuessFragment(猜数字页)、OrderFragment(积分排行榜页)和SettingFragment(设置页)3个类,以及对应的布局文件“fragment_guess.xml”、“fragment_order.xml”和“fragment_setting.xml”。 在MainActivity中的代码如下:

package com.example.mygame; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private LinearLayout ILay_guess,ILay_order,ILay_setting; private ImageView img_guess,img_order,img_setting; private TextView txt_guess,txt_order,txt_setting; private Fragment fm_guess,fm_order,fm_setting; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setDefaultFragment(); setOnClickLisener(); } private void initView(){ ILay_guess = findViewById(R.id.llay_guess); ILay_order = findViewById(R.id.llay_order); ILay_setting = findViewById(R.id.llay_setting); img_guess = findViewById(R.id.img_guess); img_order = findViewById(R.id.img_order); img_setting = findViewById(R.id.img_setting); txt_guess = findViewById(R.id.txt_guess); txt_order = findViewById(R.id.txt_order); txt_setting = findViewById(R.id.txt_setting); } private void setDefaultFragment(){ FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); fm_guess = new GuessFragment(); transaction.replace(R.id.fragment_content,fm_guess,"GUESS"); transaction.commit(); } private void setOnClickLisener(){ ILay_guess.setOnClickListener(new LinearLayoutOnClickLisener()); ILay_order.setOnClickListener(new LinearLayoutOnClickLisener()); ILay_setting.setOnClickListener(new LinearLayoutOnClickLisener()); } private class LinearLayoutOnClickLisener implements View.OnClickListener{ @Override public void onClick(View v) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); resetLinearLayout(); switch (v.getId()){ case R.id.llay_guess: if (fm_guess == null){ fm_guess = new GuessFragment(); } img_guess.setImageResource(R.drawable.game_on); txt_guess.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_pressed)); transaction.replace(R.id.fragment_content,fm_guess,"GUESS"); break; case R.id.llay_order: if (fm_order == null){ fm_order = new OrderFragment(); } img_order.setImageResource(R.drawable.rank_on); txt_order.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_pressed)); transaction.replace(R.id.fragment_content,fm_order,"ORDER"); break; case R.id.llay_setting: if (fm_setting == null){ fm_setting = new SettingFragment(); } img_setting.setImageResource(R.drawable.setting_on); txt_setting.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_pressed)); transaction.replace(R.id.fragment_content,fm_setting,"SETTING"); break; } transaction.commit(); } } private void resetLinearLayout(){ img_guess.setImageResource(R.drawable.game_off); img_order.setImageResource(R.drawable.rank_off); img_setting.setImageResource(R.drawable.setting_off); txt_guess.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_normal)); txt_order.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_normal)); txt_setting.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.color_txt_normal)); } }

【“设置”模块的实现】 在对应的布局文件“fragment_setting.xml”中,代码布局如下:

布局文件中涉及的“strings.xml”文件内容如下:

请输入默认姓名: 使用默认姓名: 默认范围: 保存设置 默认姓名 100 1000 10000

该模块的逻辑实现代码在“SettingFragment”类中实现:

package com.example.mygame; import android.content.Context; import android.content.SharedPreferences; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; public class SettingFragment extends Fragment{ private EditText edit_name; private Button btn_save; private CheckBox chb_defaultName; private Spinner spinner; private Context context; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fragment_setting,container,false); context = view.getContext(); initView(view); btn_save.setOnClickListener(new ButtonOnClickLisener()); return view; } private void initView(View view){ edit_name = view.findViewById(R.id.edit_defaultName); btn_save = view.findViewById(R.id.btn_save); chb_defaultName = view.findViewById(R.id.chb_name); spinner = view.findViewById(R.id.spinner); } public class ButtonOnClickLisener implements View.OnClickListener{ @Override public void onClick(View v) { SharedPreferences sharedPreferences = context.getSharedPreferences("Info",Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); int defaultRange = Integer.valueOf(spinner.getSelectedItem().toString()); editor.putInt("range",defaultRange); if (chb_defaultName.isChecked()){ String defaultName = edit_name.getText().toString(); if (defaultName.isEmpty()){ Toast.makeText(context,"请输入默认姓名!",Toast.LENGTH_SHORT).show(); return; } editor.putString("name",defaultName); } else { editor.remove("name"); } if (editor.commit()){ Toast.makeText(context,"保存成功!",Toast.LENGTH_SHORT).show(); } } } }

完成可执行run,在模拟器跑一下。 【“猜数”模块的实现】 猜数模块布局文件"fragment_guess.xml"内容如下:

在GuessFragment类中实现猜数判断逻辑:

package com.example.mygame; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.util.Random; public class GuessFragment extends Fragment { private int count,rndNum; private EditText edit_num; private TextView txt_range,txt_compare,txt_count; private Button btn_submit; private ImageView img_broad,img_bingo; private boolean flag; private String name; public int range = 0; private Context context; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fragment_guess,container,false); context = view.getContext(); initView(view); initData(); btn_submit.setOnClickListener(new ButtonOnClickLisener()); return view; } private void initView(View view){ edit_num = view.findViewById(R.id.edit_num); txt_range = view.findViewById(R.id.txt_range); txt_compare = view.findViewById(R.id.txt_compare); txt_count = view.findViewById(R.id.txt_count); btn_submit = view.findViewById(R.id.btn_submit); img_broad = view.findViewById(R.id.img_broad); img_bingo = view.findViewById(R.id.img_bingo); } public void initData(){ SharedPreferences sharedPreferences = context.getSharedPreferences("Info",Context.MODE_PRIVATE); name = sharedPreferences.getString("name",""); range = sharedPreferences.getInt("range",100); Random mRandom = new Random(); rndNum = mRandom.nextInt(range)+1; txt_range.setText("请输入1-"+range+"之间的整数"); txt_count.setText(""); txt_compare.setText(""); img_broad.setVisibility(View.INVISIBLE); img_bingo.setVisibility(View.INVISIBLE); btn_submit.setText("提交"); flag = true; count = 0; } private class ButtonOnClickLisener implements View.OnClickListener{ @Override public void onClick(View v) { if (flag){ String str_num = edit_num.getText().toString(); if (str_num.isEmpty()){ Toast.makeText(context,"请输入数字!",Toast.LENGTH_SHORT).show(); return; } edit_num.setText(""); int numInput = Integer.valueOf(str_num); if (numInput range){ Toast.makeText(context,"请输入范围内的数字!",Toast.LENGTH_SHORT).show(); return; } count += 1; img_broad.setVisibility(View.VISIBLE); txt_count.setText("猜数次数:"+count); if (numInput > rndNum){ txt_compare.setText("输入的"+str_num+"太大了!"); }else if(numInput txt_compare.setText("恭喜你猜对啦!正确答案是:"+rndNum+"!"); img_bingo.setVisibility(View.VISIBLE); flag = false; btn_submit.setText("再猜一次"); if (name.isEmpty()){ final CustomDialog dialog = new CustomDialog(context,R.style.MyDialog); dialog.show(); Button btn_confirm = dialog.findViewById(R.id.btn_confirm); final EditText edit_name = dialog.findViewById(R.id.edit_inputName); btn_confirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { name = edit_name.getText().toString(); if (!name.isEmpty()){ insertData(); dialog.dismiss(); } } }); } else { insertData(); } } }else { initData(); } } } private void insertData(){ MyHelper helper = new MyHelper(context,"Guess.db",null,1); SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name",name); values.put("count",count); values.put("range",range); db.insert("ordertb",null,values); db.close(); } }

可以发现,在GuessFragment类中,引入了CustomDialog类,这是自定义的对话框,用于前面基本构思说的,用户在进行猜数游戏时,如果在设置页中,不选择使用默认姓名的话,游戏结束会要求用户输入用户名。 CustomDialog自定义对话框的具体实现如下: 布局文件“alertdialog_input.xml”:

布局文件中涉及到的“strings.xml”文件内容如下:

请输入姓名 确定

CustomDialog类实现代码:

package com.example.mygame; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.Gravity; import android.view.WindowManager; public class CustomDialog extends Dialog { private Context context; public CustomDialog(Context context,int themeResId) { super(context,themeResId); this.context = context; } @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); this.setContentView(R.layout.alertdialog_input); } @Override public void show(){ super.show(); // 设置对话框宽度、对齐方式等 WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.gravity = Gravity.CENTER; layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // getWindow().getDecorView().setPadding(0,0,0,0); getWindow().setAttributes(layoutParams); } }

【“排行榜”模块的实现】 该模块布局文件“fragment_order.xml””内容如下:

新建“viewpager_tab_hundred.xml”布局文件(用于在排行榜页中显示排名,也可以多建几个同样的文件,在排行榜实现分页显示不同范围的猜数游戏有不同的排行榜,这里只在一页显示全部):

OrderFragment类逻辑代码实现:

package com.example.mygame; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter; import android.support.v4.view.PagerTabStrip; import android.support.v4.view.ViewPager; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class OrderFragment extends Fragment { private ListView lv_hunderd,lv_thousand,lv_tenthousand; private ViewPager pager; private Context context; private PagerTabStrip tabStrip; private ArrayList viewContainer; private ArrayList titleContainer; private ArrayList[] data; //用于为每个pager的ListView准备数据 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fragment_order,container,false); context = view.getContext(); initView(view); pagersetAdapter(); return view; } private void initData(){ MyHelper helper = new MyHelper(context,"Guess.db",null,1); SQLiteDatabase db = helper.getReadableDatabase(); int[] ranges = {100,1000,1000}; data = new ArrayList[3]; data[0] = new ArrayList(); data[1] = new ArrayList(); data[2] = new ArrayList(); for (int i = 0; i while (c.moveToNext()){ data[i].add("姓名:"+c.getString(c.getColumnIndex("name"))+"\t\t花费次数: "+ c.getString(c.getColumnIndex("count"))); } }else { Log.i("info","数据库无数据"); } c.close(); } db.close(); } private void initListView(){ ArrayAdapter adapter_hundred = new ArrayAdapter(context,android.R.layout.simple_expandable_list_item_1,data[0]); lv_hunderd.setAdapter(adapter_hundred); ArrayAdapter adapter_thousand = new ArrayAdapter(context,android.R.layout.simple_expandable_list_item_1,data[1]); lv_hunderd.setAdapter(adapter_thousand); ArrayAdapter adapter_tenthousand = new ArrayAdapter(context,android.R.layout.simple_expandable_list_item_1,data[2]); lv_hunderd.setAdapter(adapter_tenthousand); } private void initView(View view){ pager = view.findViewById(R.id.viewpager); tabStrip = view.findViewById(R.id.tabstrip); tabStrip.setDrawFullUnderline(false); tabStrip.setBackgroundColor(Color.parseColor("#ccccff")); tabStrip.setTabIndicatorColor(Color.parseColor("#6666ff")); LayoutInflater inflater = getActivity().getLayoutInflater(); View view_tab1 = inflater.inflate(R.layout.viewpager_tab_hundred,null); // View view_tab2 = inflater.inflate(R.layout.viewpager_tab_thousand,null); // View view_tab3 = inflater.inflate(R.layout.viewpager_tab_tenthousand,null); lv_hunderd = view_tab1.findViewById(R.id.lv_hundred); // lv_thousand = view_tab2.findViewById(R.id.lv_thousand); // lv_tenthousand = view_tab3.findViewById(R.id.lv_tenthousand); initData(); initListView(); // 添加到ViewPager viewContainer = new ArrayList(); viewContainer.add(view_tab1); // viewContainer.add(view_tab2); // viewContainer.add(view_tab3); // 设置标题 titleContainer = new ArrayList(); titleContainer.add("排行榜"); // titleContainer.add("1-1000排行榜"); // titleContainer.add("1-10000排行榜"); } private void pagersetAdapter(){ pager.setAdapter(new PagerAdapter() { @Override public int getCount() { return viewContainer.size(); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @Override public void destroyItem(ViewGroup container,int position,Object object){ ((ViewPager)container).removeView(viewContainer.get(position)); } @Override public Object instantiateItem(ViewGroup container,int position){ ((ViewPager)container).addView(viewContainer.get(position)); return viewContainer.get(position); } @Override public int getItemPosition(Object object){ return super.getItemPosition(object); } @Override public CharSequence getPageTitle(int position){ return titleContainer.get(position); } }); } }

到这里,猜数页,猜数页填写用户名的对话框,排行榜,设置页都已经实现了。整个工程也基本完结了。

作者:唐玉金 原文地址



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有